home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / games / sakiba / source / chranim.c next >
Text File  |  2000-06-20  |  4KB  |  160 lines

  1. /********************************************************
  2.  
  3.     格闘シミュレーション「さきば」
  4.  
  5.             キャラクタアニメーション
  6.  
  7.  ********************************************************/
  8.  
  9. #include    <stdio.h>
  10. #include    <stdlib.h>
  11. #include    <sys\dos.h>
  12. #include    <sys\iocs.h>
  13.  
  14. #include    "sakiba.h"
  15. #include    "chranim.h"
  16. #include    "screen.h"
  17.  
  18.  
  19. #define    CODE1    0x40        /* スプライト格納場所 */
  20. #define    CODE2    0xa0
  21. #define    PALET1    0x08        /* パレット格納場所 */
  22. #define    PALET2    0x0c
  23.  
  24.  
  25. /******************************************
  26.     アニメーションを進める
  27.     引数    spr = スプライトパターン
  28.     戻り値    アニメーション終端か
  29.  ******************************************/
  30. Bool    anim_spr(SPR_PARAM* spr)
  31. {
  32.     short    p;
  33.  
  34.     if ( spr->now.pat == NULL ) {                /* 未使用 */
  35.         return    FALSE;
  36.     }
  37.     if ( (spr->pat_cnt >= 0) && (--spr->pat_cnt <= 0) ) {        /* パターン */
  38.         if ( spr->seq.pat[0] == SEQ_END ) {        /* 終端 */
  39.             return    TRUE;
  40.         }
  41.         if ( spr->seq.pat[0] == SEQ_LOOP ) {        /* 先頭に戻る */
  42.             spr->seq.pat = spr->now.pat;
  43.         }
  44.         if ( (p = *(spr->seq.pat)++) == NOPUT ) {    /* 非表示 */
  45.             spr->pat = NULL;
  46.         }
  47.         else {
  48.             spr->pat = spr->pat_data + p;
  49.         }
  50.         spr->pat_cnt = *(spr->seq.pat)++;
  51.     }
  52.     if ( (spr->x_cnt >= 0) && (--spr->x_cnt <= 0) ) {        /* x座標 */
  53.         if ( spr->seq.x[3] == SEQ_LOOP ) {        /* 先頭に戻る */
  54.             spr->seq.x = spr->now.x;
  55.         }
  56.         spr->x     = (REAL)*(spr->seq.x)++;
  57.         spr->dx    = (REAL)*(spr->seq.x)++;
  58.         spr->ddx   = (REAL)*(spr->seq.x)++;
  59.         spr->x_cnt = *(spr->seq.x)++;
  60.     }
  61.     else {
  62.         spr->x  += spr->dx;        /* 速度 */
  63.         spr->dx += spr->ddx;        /* 加速度 */
  64.     }
  65.     if ( (spr->y_cnt >= 0) && (--spr->y_cnt <= 0) ) {        /* y座標 */
  66.         if ( spr->seq.y[3] == SEQ_LOOP ) {        /* 先頭に戻る */
  67.             spr->seq.y = spr->now.y;
  68.         }
  69.         spr->y     = (REAL)*(spr->seq.y)++;
  70.         spr->dy    = (REAL)*(spr->seq.y)++;
  71.         spr->ddy   = (REAL)*(spr->seq.y)++;
  72.         spr->y_cnt = *(spr->seq.y)++;
  73.     }
  74.     else {
  75.         spr->y  += spr->dy;        /* 速度 */
  76.         spr->dy += spr->ddy;        /* 加速度 */
  77.     }
  78.     return    FALSE;
  79. }
  80.  
  81. /******************************************
  82.     アニメーションシーケンス設定
  83.     引数    spr = スプライトパターン
  84.         seq = シーケンス
  85.         num = シーケンス番号
  86.  ******************************************/
  87. void    set_sequence(SPR_PARAM* spr, SEQUENCE* seq)
  88. {
  89.     if ( seq ) {
  90.         spr->now = *seq;        /* 現在のシーケンス */
  91.         spr->seq = spr->now;
  92.         spr->pat_cnt = 0;        /* カウンタクリア */
  93.         spr->x_cnt   = 0;
  94.         spr->y_cnt   = 0;
  95.     }
  96.     else {                    /* 未使用 */
  97.         spr->now.pat = NULL;
  98.         spr->pat     = NULL;
  99.     }
  100. }
  101.  
  102.  
  103. /*******************************************
  104.     パターン描画
  105.     引数     spr = スプライトパターン
  106.          num = プレイヤー番号
  107.         x, y = 描画原点
  108.  *******************************************/
  109. void    draw_pat(SPR_PARAM* spr, int num, int x, int y)
  110. {
  111.     CODE    code, *p;
  112.     int    xx, i, j;
  113.  
  114.     if ( spr->pat == NULL ) {            /* 非表示 */
  115.         return;
  116.     }
  117.     if ( num == PLAYER1 ) {
  118.         code = CODE1 + PALET1*0x100;        /* 先頭スプライトコード */
  119.         p = spr->pat->code_l;            /* パターン */
  120.         x += (int)((spr->x + 65536/2)/65536) - spr->pat->w*(16/2) + 16;
  121.     }
  122.     else {
  123.         code = CODE2 + PALET2*0x100;        /* 先頭スプライトコード */
  124.         p = spr->pat->code_r;            /* パターン */
  125.         x += (int)((-spr->x + 65536/2)/65536) - spr->pat->w*(16/2) + 16;
  126.     }
  127.     y += (int)((spr->y + 65536/2)/65536) - spr->pat->h*(16/2) + 16;
  128.     for (i = 0; i < spr->pat->h; i++) {
  129.         xx = x;
  130.         for (j = 0; j < spr->pat->w; j++) {
  131.             put_sprite(code + *p++, xx, y);        /* スプライト描画 */
  132.             xx += 16;
  133.         }
  134.         y += 16;
  135.     }
  136. }
  137.  
  138.  
  139. /******************************************
  140.     キャラクタスプライト読み込み
  141.         引数    chr = キャラクタ
  142.         戻り値    0 : 読み込み完了
  143.             1 : 読み込み失敗
  144.  ******************************************/
  145. int    load_chr(CHR_PARAM* chr)
  146. {
  147.     chr->spr[0].pat_data = chr->data->pat_data;    /* パターンデータ設定 */
  148.     chr->spr[1].pat_data = chr->data->pat_data;
  149.  
  150.     if ( chr->num == PLAYER1 ) {            /* プレイヤー1 */
  151.         return    load_sprite(chr->data->sp_name, chr->data->pal_name[chr->num],
  152.                                     CODE1, PALET1);
  153.     }
  154.     else {                        /* プレイヤー2 */
  155.         return    load_sprite(chr->data->sp_name, chr->data->pal_name[chr->num],
  156.                                     CODE2, PALET2);
  157.     }
  158. }
  159.  
  160. /*********************** End of File *********************************************/